package gcp.testes;

import static org.junit.Assert.assertEquals;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.Before;
import org.junit.Test;

import gcp.Amigo;
import gcp.Emprestimo;
import gcp.Filme;
import gcp.Gibi;
import gcp.Jogo;
import gcp.Pessoa;
import gcp.Usuario;
import gcp.cadastros.CadastroEmprestimo;
import gcp.enums.ClassificacaoEtaria;
import gcp.enums.GeneroFilme;
import gcp.enums.GibiEstado;
import gcp.enums.ItemEstado;
import gcp.enums.Sexo;
import gcp.enums.TipoDeJogo;

/**
 * Classe de testes de CadastraColecionavel.
 * @author catharine
 */
public class CadastroEmprestimoTeste {
	private CadastroEmprestimo CadastroEmprestimo;
	private Emprestimo emprestimo1,emprestimo2,emprestimo3;
	private Jogo jogo;
	private Gibi gibi;
	private Filme filme;
	private Pessoa amigo1;
	private Pessoa proprietario1;
	private Date sexta;
	private Date sabado;
	
	/**
	 * Inicializacao das variaveis utilizadas aos longo dos testes da classe.
	 * 
	 * @throws Exception
	 *             Lancada algum parametro for invalido.
	 */
	@Before
	public void inicializa() throws Exception {
		CadastroEmprestimo = new CadastroEmprestimo();
		emprestimo1 = new Emprestimo(jogo, amigo1,proprietario1,sexta);
		emprestimo2 = new Emprestimo(filme, amigo1,proprietario1,sabado);
		emprestimo3 = new Emprestimo(gibi, amigo1,proprietario1,sexta);
		amigo1 = new Amigo("Catharine", "Quintans", Sexo.FEMININO);
		proprietario1 = new Amigo("Natasha", "Bezerra", Sexo.FEMININO);
		sexta = new SimpleDateFormat("dd/MM/yyyy").parse("12/12/2009");
		sabado = new SimpleDateFormat("dd/MM/yyyy").parse("13/12/2009");;
		jogo = new Jogo("The Beatles: Rock Band", "MTV Games", 2009, ClassificacaoEtaria.DOZE,
				TipoDeJogo.INDEFINIDO, ItemEstado.FALTANDO, null);
		gibi = new Gibi("Batman", "DC", 2009, ClassificacaoEtaria.DOZE, ItemEstado.FALTANDO,
				GibiEstado.CONSERVADO, null);
		filme = new Filme("Inglourious Bastards", "Universal Pictures", 2009,
				ClassificacaoEtaria.DEZOITO, ItemEstado.FALTANDO, GeneroFilme.EPICO, null);
	}

	/**
	 * Adiciona um jogo ao emprestimo.
	 * 
	 * @throws Exception
	 *             Lancada quando o jogo for nulo ou vazio.
	 */
	@Test
	public void TestaAdicionarJogo() throws Exception {
		CadastroEmprestimo.adicionaEmprestimo(emprestimo1);
		assertEquals(1, CadastroEmprestimo.getEmprestimos().size());
	}

	/**
	 * Adiciona um gibi ao emprestimo.
	 * 
	 * @throws Exception
	 *             Lancada quando o gibi for nulo ou vazio.
	 */
	@Test
	public void TestaAdicionarGibi() throws Exception {
		CadastroEmprestimo.adicionaEmprestimo(emprestimo3);
		assertEquals(1, CadastroEmprestimo.getEmprestimos().size());
	}

	/**
	 * Adiciona um gibi ao emprestimo.
	 * 
	 * @throws Exception
	 *             Lancada quando o filme for nulo ou vazio.
	 */
	@Test
	public void TestaAdicionarFilme() throws Exception {
		CadastroEmprestimo.adicionaEmprestimo(emprestimo3);
		assertEquals(1, CadastroEmprestimo.getEmprestimos().size());
	}

	/**
	 * Remove um jogo adicionado nos emprestimos.
	 * 
	 * @throws Exception
	 *             Lancada quando o jogo for nulo ou vazio.
	 */
	@Test
	public void TestaRemoverJogo() throws Exception {
		CadastroEmprestimo.adicionaEmprestimo(emprestimo1);
		CadastroEmprestimo.adicionaEmprestimo(emprestimo3);
		CadastroEmprestimo.adicionaEmprestimo(emprestimo2);
		CadastroEmprestimo.removeEmprestimo(emprestimo1);
		assertEquals(2, CadastroEmprestimo.getEmprestimos().size());
	}

	/**
	 * Remove um gibi adicionado aos emprestimos.
	 * 
	 * @throws Exception
	 *             Lancada quando o gibi for nulo ou vazio.
	 */
	@Test
	public void TestaRemoverGibi() throws Exception {
		CadastroEmprestimo.adicionaEmprestimo(emprestimo1);
		CadastroEmprestimo.adicionaEmprestimo(emprestimo3);
		CadastroEmprestimo.adicionaEmprestimo(emprestimo2);
		CadastroEmprestimo.removeEmprestimo(emprestimo3);
		assertEquals(2, CadastroEmprestimo.getEmprestimos().size());
	}

	/**
	 * Remove um filme adicionado aos emprestimo.
	 * 
	 * @throws Exception
	 *             Lancada quando o filme for nulo ou vazio.
	 */
	@Test
	public void TestaRemoverFilme() throws Exception {
		CadastroEmprestimo.adicionaEmprestimo(emprestimo1);
		CadastroEmprestimo.adicionaEmprestimo(emprestimo3);
		CadastroEmprestimo.adicionaEmprestimo(emprestimo2);
		CadastroEmprestimo.removeEmprestimo(emprestimo2);
		assertEquals(2, CadastroEmprestimo.getEmprestimos().size());
	}
	/**
	 * Lista os colecionaveis adicionados aos emprestimos.
	 * 
	 * @throws Exception
	 *             Lancada quando algum parametro for nulo ou vazio.
	 */
	@Test
	public void TestaGetItensPedidosEmprestados() throws Exception {
		Usuario usuario1 = new Usuario("Diego","sobrenome", Sexo.FEMININO,"login",
	            "senha");
		CadastroEmprestimo.adicionaEmprestimo(emprestimo1);
		CadastroEmprestimo.adicionaEmprestimo(emprestimo3);
		CadastroEmprestimo.adicionaEmprestimo(emprestimo2);
		CadastroEmprestimo.getItensPedidosEmprestados(usuario1);
	}

	/**
	 * Tenta adicionar um colecionavel nulo aS EMPRESTIMOS.
	 * 
	 * @throws Exception
	 *             Lancada quando o colecionavel for nulo.
	 */
	@Test(expected = Exception.class)
	public void TestaAdicionarColecionavelNulo() throws Exception {
		Emprestimo emprestimo = null;
		CadastroEmprestimo.adicionaEmprestimo(emprestimo);
	}

	/**
	 * Tenta remover um colecionavel nulo dos emprestimos.
	 * 
	 * @throws Exception
	 *             Lancada quando o colecionavel for nulo.
	 */
	@Test(expected = Exception.class)
	public void TestaRemoveColecionavelVazio() throws Exception {
		Emprestimo emprestimo = null;
		CadastroEmprestimo.removeEmprestimo(emprestimo);
	}
}